// rapidjson/example/simpledom/simpledom.cpp`
#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include <iostream>

#include "JsonCpp.h"

using namespace rapidjson;

int m1ain()
{
    // 1. 把 JSON 解析至 DOM。
    const char *json = "{\"project\":\"rapidjson\",\"stars\":10}";
    Document d;
    d.Parse(json);

    // 2. 利用 DOM 作出修改。
    Value &s = d["stars"];
    s.SetInt(s.GetInt() + 1);

    // 3. 把 DOM 转换（stringify）成 JSON。
    StringBuffer buffer;
    Writer<StringBuffer> writer(buffer);
    d.Accept(writer);

    // Output {"project":"rapidjson","stars":11}
    std::cout << buffer.GetString() << std::endl;
    return 0;
}

int m2ain(void)
{
    const char *json = "[{\"hello\":\"world\"}]";

    Document doc;
    if (doc.Parse<0>(json).HasParseError())
    {
        std::cout << doc.GetParseError() << std::endl;
    }

    for (size_t i = 0; i < doc.Size(); i++)
    {
        const Value &val = doc[i];
        std::cout << val["hello"].GetString() << std::endl;
    }

    return 0;
}

int main3(void)
{
    rapidjson::StringBuffer buf;
    rapidjson::Writer<rapidjson::StringBuffer> writer(buf); //json 类对象 writer
    writer.StartArray();                                    //开始创建json 对象列表

    for (size_t i = 0; i < 5; i++)
    {
        writer.StartObject(); //开始创建json 对象

        writer.String("ID");
        writer.Int(i + 1);

        writer.String("Height");
        writer.Double(176.25);

        writer.String("Name");
        writer.String("Peter");

        writer.String("Address");
        writer.String("ShenZhen");

        writer.EndObject();
    }

    writer.EndArray();

    std::cout << buf.GetString() << std::endl;

    return 0;
}

/**
 * @brief 在创建 json 对象之前，先初始化一个 writer，需要用 StringBuffer 来初始化。在创建json 对象时，
 * 需要将键值对一个一个地写入，写入时注意写入键值的类型，要根据不同的类型调用不同的接口写入，
 * 这个过程稍显繁琐，可以通过简单的封装来简化。
 * 
 */

int main(void)
{
    JsonCpp jcp;
    jcp.StartArray();
    for (size_t i = 0; i < 10; i++)
    {
        jcp.StartObject();
        jcp.WriteJson("ID", i);
        jcp.WriteJson("Name", "Peter");
        jcp.WriteJson("Address", "Shenzhen");
        jcp.EndObject();
    }

    jcp.EndArray();

    std::cout << jcp.GetString() << std::endl;

    return 0;
}